function processCategory(nodeData, legend) {
  // 加个category，用于辨别节点的颜色
  let nodeName = nodeData['nodeName']
  // 看一下之前有没有这个类型的节点，有就直接赋值，没有就增加再赋值
  let existIndex = legend.indexOf(nodeName)
  if(existIndex != -1) {
    return existIndex
  } else {
    legend.push(nodeName)
    // 返回最后一个
    return legend.length - 1
  }
}
/**
 * data:[
 *  {
 *    start_node: {...},
 *    end_node: {...},
 *    relationship: {...},
 *  },
 *  ...
 * ]
 */
export function convertRelationshipDataToEChartData(data) {
  const nodes = {}; // 用于存储唯一的节点
  const links = []; // 用于存储关系
  const categories = []; // 用于辨别节点的不同
  const legend = []; // 用于告诉别人这个节点是什么名称的节点
  // 遍历数据中的每个对象
  data.forEach(obj => {
    const { start_node, end_node, relationship } = obj;

    // 达到纯函数的目的，在创建的变量中进行修改
    const processStartNode = Object.assign(start_node)
    const processEndNode = Object.assign(end_node)
    const processRelationship = Object.assign(relationship)

    // 处理category
    processStartNode['category'] = processCategory(processStartNode, legend)
    processEndNode['category'] = processCategory(processEndNode, legend)

    // 通过name和nodeName判断
    // 因为name可能相同
    const startKey = `${processStartNode.name}/${processStartNode.nodeName}`
    const endKey = `${processEndNode.name}/${processEndNode.nodeName}`

    // echart中展示的name不能一样,但是我们可以改变展示的内容(默认是name)
    // 这里的策略是,我们showName的内容是原来name的内容,而name的内容我们改成上方的key
    processStartNode.showName = processStartNode.name
    processStartNode.name = startKey
    processEndNode.showName = processEndNode.name
    processEndNode.name = endKey
    if (!nodes[startKey]) {
      nodes[startKey] = processStartNode;
    }
    if (!nodes[endKey]) {
      nodes[endKey] = processEndNode;
    }
    // 将 relationship 对象添加到 links 数组中
    const linkObj = {
     source: processStartNode.name,
     target: processEndNode.name,
     value: processRelationship.name,
     label: {
       show: true,
       // 展示边的名称
       formatter: '{c}'
     }
    }
    links.push(linkObj);
  });
  // 最后categories数组中全是字符串（节点的标签），由于echarts需要的是数值1，2，3辨别节点
  for(let i = 0; i < legend.length; i++) {
    categories[i] = {
      name: legend[i]
    }
  }
  return {
    nodes: Object.values(nodes),
    links,
    categories
  };
}
